package com.cata.mall.service;

import com.cata.mall.dto.UmsAdminParam;
import com.cata.mall.dto.UpdateAdminPasswordParam;
import com.cata.mall.model.UmsAdmin;
import com.cata.mall.model.UmsResource;
import com.cata.mall.model.UmsRole;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * @作者: Tao
 * @日期: 2025/10/11
 * @时间: 15:33
 * @描述: 后台用户管理Service<pre>
 */
public interface UmsAdminService {

    /**
     * 根据用户名获取管理员信息
     * @param username 用户名
     * @return 管理员信息对象，如果不存在则返回null
     */
    UmsAdmin getAdminByUsername(String username);

    /**
     * 注册新的管理员账户
     * @param umsAdminParam 管理员注册参数对象，包含用户名、密码等注册信息
     * @return 注册成功的管理员信息对象
     */
    UmsAdmin register(UmsAdminParam umsAdminParam);


    /**
     * 登录功能
     * @param username 用户名
     * @param password 密码
     * @return 生成的JWT的token
     */
    String login(String username,String password);

    /**
     * 刷新token的功能
     * @param oldToken 旧的token
     */
    String refreshToken(String oldToken);

    /**
     * 根据ID获取管理员信息
     * @param id 管理员ID
     * @return 管理员信息对象
     */
    UmsAdmin getItem(Long id);

    /**
     * 分页查询管理员列表
     * @param keyword 搜索关键字
     * @param pageSize 每页显示数量
     * @param pageNum 页码
     * @return 管理员列表
     */
    List<UmsAdmin> list(String keyword, Integer pageSize, Integer pageNum);

    /**
     * 更新管理员信息
     * @param id 管理员ID
     * @param admin 管理员对象，包含要更新的信息
     * @return 更新记录数
     */
    int update(Long id, UmsAdmin admin);

    /**
     * 删除管理员
     * @param id 管理员ID
     * @return 删除记录数
     */
    int delete(Long id);

    /**
     * 更新管理员角色关联关系
     * @param adminId 管理员ID
     * @param roleIds 角色ID列表
     * @return 更新记录数 <pre>
     *
     * 说明：@Transactional- 事务注解，保证数据一致性<pre>
     *   方法执行时，Spring会自动开启事务，如果方法正常执行完毕则提交事务，如果抛出异常则回滚事务，确保数据一致性
     */
    @Transactional
    int updateRole(Long adminId, List<Long> roleIds);

    /**
     * 获取管理员角色列表
     * @param adminId 管理员ID
     * @return 角色列表
     */
    List<UmsRole> getRoleList(Long adminId);

    /**
     * 获取管理员资源列表
     * @param adminId 管理员ID
     * @return 资源列表
     */
    List<UmsResource> getResourceList(Long adminId);

    /**
     * 更新管理员密码
     * @param updatePasswordParam 密码更新参数对象
     * @return 更新记录数
     */
    int updatePassword(UpdateAdminPasswordParam updatePasswordParam);

    /**
     * 根据用户名加载用户详情
     * @param username 用户名
     * @return 用户详情对象
     */
    UserDetails loadUserByUsername(String username);

    /**
     * 获取缓存服务实例
     * @return 管理员缓存服务
     */
    UmsAdminCacheService getCacheService();


    /**
     * 登出功能
     * @param username 用户名
     */
    void logout(String username);
}
